/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package nexus.criterios;

import control.MessageFactory;
import java.util.ArrayList;
import javax.faces.context.FacesContext;
import javax.faces.el.VariableResolver;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;
import javax.faces.model.SelectItem;
import javax.swing.JOptionPane;


import control.UserBean;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import nexus.criterios.CriterioCalificacion;
import nexus.criterios.CriterioCalificacionCualitativo;
import nexus.criterios.CriterioCalificacionCuantitativo;
import nexus.criterios.GestorCriteriosDB;
/**
 *
 * @author juampi
 */
public class CrearCriterioCalificacion implements ValueChangeListener{
    private boolean mostrarPanelCreacionCunatitativo;
    private boolean mostrarPanelCreacionCualitativo;
    private ArrayList<SelectItem> opcionesCreacion;
    private final String CUALITATIVO="evaluacion";
    private final String CUANTITATIVO="calificacion";
    private final String NINGUNO="ninguno";
    private String opcionCreacionSeleccionada="";
    private int valorMinCuantitativo;
    private int valorMaxCuantitativo;
    private String nombreNuevoCriterioCalificacion;
    private ArrayList<ItemCualitatitvo> itemsCualitativos;
    private String codigoCurso;

    public CrearCriterioCalificacion() {
        itemsCualitativos = new ArrayList<ItemCualitatitvo>();
        codigoCurso = getCodigoCurso();
    }
    /**
     * @return the mostrarPanelCreacionCunatitativo
     */


    public boolean isMostrarPanelCreacionCunatitativo() {
        
        return opcionCreacionSeleccionada.equalsIgnoreCase(CUANTITATIVO);
    }

    /**
     * @param mostrarPanelCreacionCunatitativo the mostrarPanelCreacionCunatitativo to set
     */
    public void setMostrarPanelCreacionCunatitativo(boolean mostrarPanelCreacionCunatitativo) {
        this.mostrarPanelCreacionCunatitativo = mostrarPanelCreacionCunatitativo;
    }

    /**
     * @return the mostrarPanelCreacionCualitativo
     */
    public boolean isMostrarPanelCreacionCualitativo() {
        
        return opcionCreacionSeleccionada.equalsIgnoreCase(CUALITATIVO);
    }

    /**
     * @param mostrarPanelCreacionCualitativo the mostrarPanelCreacionCualitativo to set
     */
    public void setMostrarPanelCreacionCualitativo(boolean mostrarPanelCreacionCualitativo) {
        this.mostrarPanelCreacionCualitativo = mostrarPanelCreacionCualitativo;
    }

    /**
     * @return the opcionesCreacion
     */
    public ArrayList<SelectItem> getOpcionesCreacion() {
        opcionesCreacion = new ArrayList<SelectItem>();
        SelectItem item1 = new SelectItem(CUALITATIVO, "Criterio Cualitativo");
        SelectItem item2 = new SelectItem(CUANTITATIVO,"Criterio Cuantitativo");
        opcionesCreacion.add(item1);
        opcionesCreacion.add(item2);
        return opcionesCreacion;
    }


    public void processValueChange(ValueChangeEvent event) {
        opcionCreacionSeleccionada = (String)event.getNewValue();
    }
    public void aceptarTipoCriterioCalificacion(ActionEvent event) {
        if(opcionCreacionSeleccionada.equalsIgnoreCase(CUALITATIVO)) {
            mostrarPanelCreacionCualitativo = true;
        }
        if(opcionCreacionSeleccionada.equalsIgnoreCase(CUANTITATIVO)) {
            mostrarPanelCreacionCunatitativo = true;
        }
        if(opcionCreacionSeleccionada.equalsIgnoreCase(NINGUNO)) {
            mostrarPanelCreacionCualitativo =false;
            mostrarPanelCreacionCunatitativo = false;
        }
    }

    /**
     * @return the opcionCreacionSeleccionada
     */
    public String getOpcionCreacionSeleccionada() {
        return opcionCreacionSeleccionada;
    }

    /**
     * @param opcionCreacionSeleccionada the opcionCreacionSeleccionada to set
     */
    public void setOpcionCreacionSeleccionada(String opcionCreacionSeleccionada) {
        this.opcionCreacionSeleccionada = opcionCreacionSeleccionada;
    }

    /**
     * @return the valorMinCuantitativo
     */
    public int getValorMinCuantitativo() {
        return valorMinCuantitativo;
    }

    /**
     * @param valorMinCuantitativo the valorMinCuantitativo to set
     */
    public void setValorMinCuantitativo(int valorMinCuantitativo) {
        this.valorMinCuantitativo = valorMinCuantitativo;
    }

    /**
     * @return the valorMaxCuantitativo
     */
    public int getValorMaxCuantitativo() {
        return valorMaxCuantitativo;
    }

    /**
     * @param valorMaxCuantitativo the valorMaxCuantitativo to set
     */
    public void setValorMaxCuantitativo(int valorMaxCuantitativo) {
        this.valorMaxCuantitativo = valorMaxCuantitativo;
    }
    public void anadirItemCualitativo(ActionEvent event) {
        itemsCualitativos.add(new ItemCualitatitvo("", 0));
    }
    public void guardarConfiguaracionCualitativo(ActionEvent event) {
        FacesMessage mensaje;
        if(nombreNuevoCriterioCalificacion.compareTo("")!=0) {
            CriterioCalificacionCualitativo ccc = new CriterioCalificacionCualitativo(nombreNuevoCriterioCalificacion.toUpperCase());
            HashMap<String,Double> map = new HashMap<String, Double>();
            for (ItemCualitatitvo item : itemsCualitativos) {
                map.put(item.getNombre(), item.getValor());
            }
            ccc.setValores(map);
            GestorCriteriosDB.getInstance().guardarCriterioCualitativo(getUser().getId(), ccc);
            mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "creacionCriterioCalificacionCorrecta", "");
        }else {
            mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "errorNombreCreacionCriterioCalificacionCorrecta", "");
        }
        FacesContext.getCurrentInstance().addMessage(null, mensaje);
    }
    public void eliminarCualitativos(ActionEvent event) {
        Iterator<ItemCualitatitvo> i = itemsCualitativos.iterator();
        while(i.hasNext()) {
            ItemCualitatitvo item = i.next();
            if(item.isEliminar()) {
                itemsCualitativos.remove(item);
            }
        }
    }
    public void crearCriterioCuantitativo(ActionEvent event) {
        FacesMessage mensaje;
        try {
            if(nombreNuevoCriterioCalificacion.compareTo("")!=0) {
                CriterioCalificacionCuantitativo ccu = new CriterioCalificacionCuantitativo(nombreNuevoCriterioCalificacion.toUpperCase(), valorMinCuantitativo, valorMaxCuantitativo);
                GestorCriteriosDB.getInstance().guardarCriterioCuantitativo(getUser().getId(), ccu);
                mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR,"creacionCriterioCuantitativoCorrecta", "");
            }else {
                mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR,"errorNombreCreacionCriterioCuantitativo", "");
            }
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
        }catch (Exception e ) {
            mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR,"errorCriterioCuantitativo", "");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
        }
        
    }

    /**
     * @return the itemsCualitativos
     */
    public ArrayList<ItemCualitatitvo> getItemsCualitativos() {
        if(!codigoCurso.equalsIgnoreCase(getCodigoCurso())) {
            itemsCualitativos = new ArrayList<ItemCualitatitvo>();
        }
        return itemsCualitativos;
    }

    /**
     * @param itemsCualitativos the itemsCualitativos to set
     */
    public void setItemsCualitativos(ArrayList<ItemCualitatitvo> itemsCualitativos) {
        this.itemsCualitativos = itemsCualitativos;
    }

    /**
     * @return the codigoCurso
     */
    public String getCodigoCurso() {
        FacesContext context = FacesContext.getCurrentInstance();
        VariableResolver vr = context.getApplication().getVariableResolver();
        UserBean user = (UserBean) vr.resolveVariable(context, "userBean");
        return user.getCodigoCurso();
    }

    /**
     * @param codigoCurso the codigoCurso to set
     */
    public void setCodigoCurso(String codigoCurso) {
        this.codigoCurso = codigoCurso;
    }

    /**
     * @return the nombreNuevoCriterioCalificacion
     */
    public String getNombreNuevoCriterioCalificacion() {
        return nombreNuevoCriterioCalificacion;
    }

    /**
     * @param nombreNuevoCriterioCalificacion the nombreNuevoCriterioCalificacion to set
     */
    public void setNombreNuevoCriterioCalificacion(String nombreNuevoCriterioCalificacion) {
        this.nombreNuevoCriterioCalificacion = nombreNuevoCriterioCalificacion;
    }
    public UserBean getUser() {
        FacesContext context = FacesContext.getCurrentInstance();
        VariableResolver vr = context.getApplication().getVariableResolver();
        UserBean bean = (UserBean)vr.resolveVariable(context, "userBean");
        return bean;
    }
    public void actionMostrarCriterioSelecionado(ActionEvent event) {
        try {
            UIParameter component = (UIParameter) event.getComponent().findComponent("criterioCalificacionSeleccionado");

            CriterioCalificacion cc = (CriterioCalificacion)component.getValue();
            nombreNuevoCriterioCalificacion = cc.getNombreCriterio();
            if(cc instanceof CriterioCalificacionCualitativo) {

                opcionCreacionSeleccionada = CUALITATIVO;
                CriterioCalificacionCualitativo ccu = (CriterioCalificacionCualitativo)cc;
                HashMap<String,Double> map = ccu.getValores();
                itemsCualitativos = new ArrayList<ItemCualitatitvo>();
                Set<String>  sets = map.keySet();
                for (String string : sets) {
                    ItemCualitatitvo nuevoIC = new ItemCualitatitvo(string, map.get(string));
                    itemsCualitativos.add(nuevoIC);
                }
                //JOptionPane.showMessageDialog(null, "entro a primero "+cc);
            }
            if(cc instanceof CriterioCalificacionCuantitativo) {

                opcionCreacionSeleccionada = CUANTITATIVO;
                CriterioCalificacionCuantitativo ccc = (CriterioCalificacionCuantitativo)cc;
                setValorMinCuantitativo(ccc.getMinimo());
                setValorMaxCuantitativo(ccc.getMaximo());
                //JOptionPane.showMessageDialog(null, "entro a segundo "+cc);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Lanza un exepction "+e.getLocalizedMessage() );
        }
        
    }
    public void actionEliminarCriterioSelecionado(ActionEvent event) {
        UIParameter component = (UIParameter) event.getComponent().findComponent("criterioCalificacionSeleccionadoEliminar");
        CriterioCalificacion cc = (CriterioCalificacion)component.getValue();
        boolean band = GestorCriteriosDB.getInstance().eliminarCriterioCalificacion(cc.getNombreCriterio());
        FacesMessage mensaje;
        if(band) {
            mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR,"mensajeElinacionCorrectaCriterioCalificacion", "");
        } else {
            mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR,"mensajeElinacionIncorrectaCriterioCalificacion", "");
        }
        FacesContext.getCurrentInstance().addMessage(null, mensaje);
    }
    public String irACrearCriterioCalificacion() {
        nombreNuevoCriterioCalificacion = "";
        String res ="irACrearCriterioCalificacion";
        itemsCualitativos = new ArrayList<ItemCualitatitvo>();
        valorMinCuantitativo = 0;
        valorMaxCuantitativo = 0;
        return res;
    }
}
